/*
处理与用户相关的方法
 */

package controllers

import (
	"encoding/json"
	"errors"
	"fmt"
	"github.com/boyane/chartroom/client/utils"
	"github.com/boyane/chartroom/common/message"
	"github.com/boyane/chartroom/server/models"
	"net"
)

type User struct {
	// 暂时没有用户有关的字段...
	models.User
}

// 登陆函数
func (this *User) Login(userId int, userPwd string) {
	// 连接服务端
	conn, err := net.Dial("tcp", "127.0.0.1:8889")
	if err != nil{
		fmt.Println("net.Dial fail =", err)
		return
	}
	defer func() {_ = conn.Close()}()

	// 组装发送数据
	var mes message.Message
	mes.Type = message.LoginMesType

	var loginMes message.LoginMes
	loginMes.UserId = userId
	loginMes.UserPwd = userPwd

	// 将发送的数据序列化
	data, err := json.Marshal(loginMes)
	if err != nil{
		fmt.Println("json.Marshal fail", err)
		return
	}
	mes.Data = string(data)

	data, err = json.Marshal(mes)
	if err != nil{
		fmt.Println("json.Marshal fail", err)
		return
	}

	// 发送的数据
	fmt.Println("发送的数据", string(data))

	// 发送数据
	ts := &utils.ClientTransfer{}
	ts.Conn = conn
	err = ts.WritePkg(data)
	if err != nil{
		fmt.Println("utils.WritePkg fail err =", err)
	}

	// 读取服务端返回的消息
	var resMes message.Message
	var loginData message.LoginResMes
	resMes, err = ts.ReadPkg()
	if err != nil{
		fmt.Println(" utils.ReadPkg fail err=", err)
		return
	}

	err = json.Unmarshal([]byte(resMes.Data), &loginData)
	if err != nil{
		fmt.Println(" json.Unmarshal fail err=", err)
		return
	}

	// 判断是否登陆成功
	if loginData.Code != 200{
		fmt.Println(loginData.Error)
		return
	}else{
		// 显示所有在线用户
		for _, v := range loginData.OnlineIds{
			OnlineUsers.Users = append(OnlineUsers.Users, v)
			fmt.Println("在线用户id:", v)
		}
		this.UserId = userId
		// 全局保存一个连接
		NewConn(conn, this)
		// 开一个协程监听服务端的消息
		go ServerProcessMes(conn)
		// 显示操作菜单
		ShowMenu()

	}
}

// 注册方法
func (this *User) Register(userId int, userPwd string, userName string) (err error){
	// 连接服务端
	conn, err := net.Dial("tcp", "127.0.0.1:8889")
	if err != nil{
		fmt.Println("net.Dial fail =", err)
		return
	}
	defer func() {_ = conn.Close()}()

	// 组装发送数据
	var mes message.Message
	mes.Type = message.RegisterMesType

	var registerMes message.RegisterMes
	registerMes.UserId = userId
	registerMes.UserPwd = userPwd
	registerMes.UserName = userName

	// 将发送的数据序列化
	data, err := json.Marshal(registerMes)
	if err != nil{
		fmt.Println("json.Marshal fail", err)
		return
	}
	mes.Data = string(data)

	data, err = json.Marshal(mes)
	if err != nil{
		fmt.Println("json.Marshal fail", err)
		return
	}

	// 发送的数据
	fmt.Println("发送的数据", string(data))

	// 发送数据
	ts := &utils.ClientTransfer{}
	ts.Conn = conn
	err = ts.WritePkg(data)
	if err != nil{
		fmt.Println("utils.WritePkg fail err =", err)
	}

	// 读取服务端返回的消息
	var resMes message.Message
	var registerResMes message.RegisterResMes
	resMes, err = ts.ReadPkg()
	if err != nil{
		fmt.Println(" utils.ReadPkg fail err=", err)
		return
	}

	err = json.Unmarshal([]byte(resMes.Data), &registerResMes)
	if err != nil{
		fmt.Println(" json.Unmarshal fail err=", err)
		return
	}

	// 判断是否注册成功
	if registerResMes.Code != 200{
		fmt.Println(registerResMes.Error)
		return errors.New(registerResMes.Error)
	}
	return
}
